const crypto = require('crypto');
const sha256 = (message, secret = '', encoding) => {
  const hmac = crypto.createHmac('sha256', secret);
  return hmac.update(message).digest(encoding);
};
const getHash = (message, encoding = 'hex') => {
  const hash = crypto.createHash('sha256');
  return hash.update(message).digest(encoding);
};

const getDate = timestamp => {
  const date = new Date(timestamp * 1000);
  const year = date.getUTCFullYear();
  const month = ('0' + (date.getUTCMonth() + 1)).slice(-2);
  const day = ('0' + date.getUTCDate()).slice(-2);
  return `${year}-${month}-${day}`;
};

const getAuthorization = ({ secretId, secretKey, timestamp, payload }) => {
  // 密钥参数
  const SECRET_ID = secretId;
  const SECRET_KEY = secretKey;

  const host = 'asr.tencentcloudapi.com';
  const service = 'asr';
  const region = 'ap-guangzhou';
  const action = 'SentenceRecognition';
  const version = '2019-06-14';
  const date = getDate(timestamp);
  // ************* 步骤 1：拼接规范请求串 *************
  const signedHeaders = 'content-type;host';
  const hashedRequestPayload = getHash(JSON.stringify(payload));
  const httpRequestMethod = 'POST';
  const canonicalUri = '/';
  const canonicalQueryString = '';
  const canonicalHeaders = 'content-type:application/json; charset=utf-8\n' + 'host:' + host + '\n';
  const canonicalRequest = httpRequestMethod + '\n' + canonicalUri + '\n' + canonicalQueryString + '\n' + canonicalHeaders + '\n' + signedHeaders + '\n' + hashedRequestPayload;
  // ************* 步骤 2：拼接待签名字符串 *************
  const algorithm = 'TC3-HMAC-SHA256';
  const hashedCanonicalRequest = getHash(canonicalRequest);
  const credentialScope = date + '/' + service + '/' + 'tc3_request';
  const stringToSign = algorithm + '\n' + timestamp + '\n' + credentialScope + '\n' + hashedCanonicalRequest;
  // ************* 步骤 3：计算签名 *************
  const kDate = sha256(date, 'TC3' + SECRET_KEY);
  const kService = sha256(service, kDate);
  const kSigning = sha256('tc3_request', kService);
  const signature = sha256(stringToSign, kSigning, 'hex');
  // ************* 步骤 4：拼接 Authorization *************
  const authorization = algorithm + ' ' + 'Credential=' + SECRET_ID + '/' + credentialScope + ', ' + 'SignedHeaders=' + signedHeaders + ', ' + 'Signature=' + signature;
  return authorization;
};
const sendVoice = async ({ secretId, secretKey, payload }) => {
  try {
    const timestamp = parseInt(new Date().getTime() / 1000) - 1;
    const res = await new Promise((resolve, reject) => {
      uni.request({
        url: 'https://asr.tencentcloudapi.com',
        method: 'POST',
        data: payload,
        header: {
          'Content-Type': 'application/json; charset=utf-8',
          'X-TC-Version': '2019-06-14',
          'X-TC-Action': 'SentenceRecognition',
          'X-TC-Timestamp': timestamp,
          Authorization: getAuthorization({ secretKey, secretId, timestamp, payload })
        },
        success: res => {
          resolve(res.data);
        },
        fail: err => {
          reject(err);
        }
      });
    });
    return res;
  } catch (error) {
    return Promise.reject(error);
  }
};
export default sendVoice;
